package top.continew.wechat.common.util;

import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.file.FileNameUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;

/**
 * 文件工具类
 */
@Slf4j
public class FileUtil {

    /**
     * 获取文件扩展名
     *
     * @param fileName 文件名
     * @return 扩展名
     */
    public static String getExtension(String fileName) {
        return FileNameUtil.extName(fileName);
    }

    /**
     * 获取文件名（不含扩展名）
     *
     * @param fileName 文件名
     * @return 文件名（不含扩展名）
     */
    public static String getNameWithoutExtension(String fileName) {
        return FileNameUtil.mainName(fileName);
    }

    /**
     * 获取文件类型
     *
     * @param file 文件
     * @return 文件类型
     */
    public static String getFileType(File file) {
        return FileTypeUtil.getType(file);
    }

    /**
     * 获取文件类型
     *
     * @param inputStream 输入流
     * @return 文件类型
     */
    public static String getFileType(InputStream inputStream) {
        return FileTypeUtil.getType(inputStream);
    }

    /**
     * 生成唯一文件名
     *
     * @param originalFilename 原始文件名
     * @return 唯一文件名
     */
    public static String generateUniqueFileName(String originalFilename) {
        String extension = getExtension(originalFilename);
        return UUID.randomUUID().toString().replace("-", "") + (StringUtil.isNotEmpty(extension) ? "." + extension : "");
    }

    /**
     * 保存文件
     *
     * @param file     文件
     * @param savePath 保存路径
     * @return 保存后的文件路径
     */
    public static String saveFile(MultipartFile file, String savePath) {
        try {
            // 创建目录
            Path directory = Paths.get(savePath);
            if (!Files.exists(directory)) {
                Files.createDirectories(directory);
            }

            // 生成唯一文件名
            String uniqueFileName = generateUniqueFileName(file.getOriginalFilename());
            Path targetPath = directory.resolve(uniqueFileName);

            // 保存文件
            Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

            return targetPath.toString();
        } catch (IOException e) {
            log.error("保存文件失败：{}", e.getMessage(), e);
            throw new RuntimeException("保存文件失败：" + e.getMessage(), e);
        }
    }

    /**
     * 删除文件
     *
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    public static boolean deleteFile(String filePath) {
        try {
            Path path = Paths.get(filePath);
            return Files.deleteIfExists(path);
        } catch (IOException e) {
            log.error("删除文件失败：{}", e.getMessage(), e);
            return false;
        }
    }

    /**
     * 获取文件大小（字节）
     *
     * @param file 文件
     * @return 文件大小
     */
    public static long getFileSize(File file) {
        return file.length();
    }

    /**
     * 格式化文件大小
     *
     * @param size 文件大小（字节）
     * @return 格式化后的文件大小
     */
    public static String formatFileSize(long size) {
        return cn.hutool.core.io.FileUtil.readableFileSize(size);
    }
}
